
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FocusTraversalPolicy;
import javax.swing.table.DefaultTableModel;
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Comparator;
import javax.swing.table.TableRowSorter;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Albert Alemany Font
 */
public class VistaReglas extends JPanel {
    private JScrollPane jspTblReglas;
    private JTable tblReglas;
    private DefaultTableModel dtm;
    private SpringLayout layout;
    private JLabel lblN;
    private JTextField txtN;

    private DefaultTableModel dtmB;
    private JPanel pBusqueda;
    private JTextField txtAlpha;
    private JTextField txtBeta;
    private JLabel lblAlpha;
    private JLabel lblBeta;
    private JLabel lblIntro;
    private JScrollPane jspTblBReglas;
    private JTable tblBReglas;
    private JButton btnBuscarR;
    private SpringLayout layoutBusqueda;
    private CIReglas cir;
    
    private ArrayList<ssid> reglas;
    
    public VistaReglas(CIReglas cir){
        this.cir = cir;
        inicializar();
    }
    private void inicializarTabla() {

        
        tblReglas = new JTable();
        
        dtm = new DefaultTableModel() {
        @Override
        public boolean isCellEditable (int fila, int columna) {
            return false;
        }
        };
        
        Comparator c = new Comparator() {
            public int compare(Object o1, Object o2) {
                int a = o1.hashCode();
                int b = o2.hashCode();
                if (a > b) return 1;
                else if (a < b) return -1;
                else return 0;
            }
        };
        
        dtm.addColumn("Alpha");
        dtm.addColumn("Beta");
        dtm.addColumn("Contador");


        TableRowSorter sorter = new TableRowSorter(dtm);
        sorter.setComparator(2, c);       
        tblReglas.setModel(dtm);
        jspTblReglas = new JScrollPane(tblReglas);
        tblReglas.setRowSorter(sorter);

    }

    private void construirSorter(JTable tbl, DefaultTableModel tm) {

        Comparator c = new Comparator() {
            public int compare(Object o1, Object o2) {
                int a = o1.hashCode();
                int b = o2.hashCode();
                if (a > b) return 1;
                else if (a < b) return -1;
                else return 0;
            }
        };

        TableRowSorter sorter = new TableRowSorter(tm);
        sorter.setComparator(2, c);
        tbl.setRowSorter(sorter);

    }

    private void inicializar(){
        
        btnBuscarR = new JButton();
        btnBuscarR.addActionListener(new java.awt.event.ActionListener(){

            public void actionPerformed(ActionEvent e) {
                btnBuscarRActionPerformed(e);
            }
        });

        layout = new SpringLayout();
       
        lblAlpha = new JLabel();
        lblBeta = new JLabel();
        lblIntro = new JLabel();
        txtAlpha = new JTextField();
        txtBeta = new JTextField();
        pBusqueda = new JPanel();
        layoutBusqueda = new SpringLayout();
        lblN = new JLabel();
        txtN = new JTextField();
        lblN.setText("N:");

        
        inicializarTabla();
        inicializarPanel();
        inicializarPanelBotones();
        inicializarPanelBusqueda();
        inicializarLayout();
        inicializarLayoutBusqueda();
        montar();
    }
    
    private void btnBuscarRActionPerformed(ActionEvent e) {
        borrarTabla(2);
        String alpha = txtAlpha.getText();
        String beta = txtBeta.getText();
        
        // Búsqueda de alpha-beta con el patrón *
        if (alpha.equals("") || beta.equals("")) borrarTabla(2);
        else if (alpha.equals("*") && beta.equals("*")) {
            for (int i = 0; i < reglas.size(); ++i) anadirFila(reglas.get(i).alpha,reglas.get(i).beta,reglas.get(i).cont);
        }
        else if (alpha.equals("*")) {
            if (conPatron(beta)) {
                System.out.println(quitarPatron(beta));
                System.out.println(beta.length() + " " + quitarPatron(beta).length());
                for (int i = 0; i < reglas.size(); ++i) {
                    if (contiene(reglas.get(i).beta,quitarPatron(beta))) anadirFila(reglas.get(i).alpha,reglas.get(i).beta,reglas.get(i).cont);
                }
            }
            else {
                for (int i = 0; i < reglas.size(); ++i) {
                    if (beta.equals(reglas.get(i).beta)) anadirFila(reglas.get(i).alpha,reglas.get(i).beta,reglas.get(i).cont);
                }
            } 
        }
        else if (beta.equals("*")) {
            if (conPatron(alpha)) {
                for (int i = 0; i < reglas.size(); ++i) {
                    if (contiene(reglas.get(i).alpha,quitarPatron(alpha))) anadirFila(reglas.get(i).alpha,reglas.get(i).beta,reglas.get(i).cont);
                }
            }
            else {
                for (int i = 0; i < reglas.size(); ++i) {
                    if (alpha.equals(reglas.get(i).alpha)) anadirFila(reglas.get(i).alpha,reglas.get(i).beta,reglas.get(i).cont);
                }
            }
        }
        else if (!conPatron(alpha) && !conPatron(beta)) {
            for (int i = 0; i < reglas.size(); ++i) {
                if (reglas.get(i).alpha.equals(alpha) && reglas.get(i).beta.equals(beta))
                    anadirFila(reglas.get(i).alpha,reglas.get(i).beta,reglas.get(i).cont);
            }    
        }
        else if (!conPatron(alpha)) {
            for (int i = 0; i < reglas.size(); ++i) {
                if (reglas.get(i).alpha.equals(alpha) && contiene(reglas.get(i).beta,quitarPatron(beta)))
                    anadirFila(reglas.get(i).alpha,reglas.get(i).beta,reglas.get(i).cont);
            }
        }
        else if (!conPatron(beta)) {
            for (int i = 0; i < reglas.size(); ++i) {
                if (contiene(reglas.get(i).alpha,quitarPatron(alpha)) && reglas.get(i).beta.equals(beta))
                    anadirFila(reglas.get(i).alpha,reglas.get(i).beta,reglas.get(i).cont);
            }
        }
        else {
            for (int i = 0; i < reglas.size(); ++i) {
                if (contiene(reglas.get(i).alpha,quitarPatron(alpha)) && contiene(reglas.get(i).beta,quitarPatron((beta))))
                    anadirFila(reglas.get(i).alpha,reglas.get(i).beta,reglas.get(i).cont);
            }
        }
    }
    
    private void anadirFila(String s1, String s2, int cont) {
        String[] fila = new String[3];
        fila[0] = s1;
        fila[1] = s2;
        fila[2] = String.valueOf(cont); 
        dtmB.addRow(fila);
    }
    
    private boolean contiene(String s1, String s2) {
        if (s2.length() > s1.length()) return false;
        if ((s1.substring(0, s2.length())).equals(s2)) return true;
        return false;
    }

    private String quitarPatron(String s) {
        return s.substring(0, s.length()-1);
    }
    
    private boolean conPatron(String s) {
        if (s.charAt(s.length()-1) == '*') return true;
        return false;
    }
    
    private void inicializarPanelBusqueda() {
        
        pBusqueda.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY),"Búsqueda de reglas"));
        
        lblAlpha.setSize(30,20);
        lblAlpha.setText("Alpha:");
        lblBeta.setSize(30,20);
        lblBeta.setText("Beta:");
        lblIntro.setSize(200, 20);
        lblIntro.setText("Introduce la regla a buscar:");
        
        txtAlpha.setSize(30,30);
        txtAlpha.setText("");
        txtBeta.setSize(30,30);
        txtBeta.setText("");
        
        btnBuscarR.setText("Buscar...");
        inicializarTablaBusqueda();

    }
    public void mostrarReglas() {
        reglas = new ArrayList<ssid>();
        reglas = cir.obtenerReglas();
        borrarTabla(1);
        for (int i = 0; i < reglas.size(); ++i) {
            String[] fila = new String[3];
            fila[0] = reglas.get(i).alpha;
            fila[1] = reglas.get(i).beta;
            fila[2] = String.valueOf(reglas.get(i).cont); 
            dtm.addRow(fila);
        }
    }

    public void mostrarMensajeNoCP() {
        JOptionPane.showMessageDialog(null, "No hay ningún conjunto de pares");
    }

    public void mostrarMensajeNoN() {
        JOptionPane.showMessageDialog(null, "No se ha determinado el valor de la N");
    }

    public boolean existeN() {
        if (!txtN.getText().equals("")) return true;
        else return false;
    }

    public int getN() {
        return  Integer.valueOf(txtN.getText());
    }

    private DefaultTableModel construirTableModel(){
        DefaultTableModel tm;
        tm = new DefaultTableModel() {
        @Override
        public boolean isCellEditable (int fila, int columna) {
            return false;
        }
        };

        /*Comparator c = new Comparator() {
            public int compare(Object o1, Object o2) {
                int a = o1.hashCode();
                int b = o2.hashCode();
                if (a > b) return 1;
                else if (a < b) return -1;
                else return 0;
            }
        };*/

        tm.addColumn("Alpha");
        tm.addColumn("Beta");
        tm.addColumn("Contador");

        return tm;
        //TableRowSorter sorter = new TableRowSorter(dtm);
        //sorter.setComparator(2, c);
        //tblReglas.setModel(dtm);
        //jspTblReglas = new JScrollPane(tblReglas);
        //tblReglas.setRowSorter(sorter);
    }

    private void inicializarTablaBusqueda() {
        tblBReglas = new JTable();
        dtmB = new DefaultTableModel() {
        @Override
        public boolean isCellEditable (int fila, int columna) {
            return false;
        }
        };
        
        Comparator c = new Comparator() {
            public int compare(Object o1, Object o2) {
                int a = o1.hashCode();
                int b = o2.hashCode();
                if (a > b) return 1;
                else if (a < b) return -1;
                else return 0;
            }
        };
        dtmB.addColumn("Alpha");
        dtmB.addColumn("Beta");
        dtmB.addColumn("Contador");
        
        TableRowSorter sorter = new TableRowSorter(dtmB);
        sorter.setComparator(2, c);       
        tblBReglas.setModel(dtmB);
        jspTblBReglas = new JScrollPane(tblBReglas);
        tblBReglas.setRowSorter(sorter);      
        
    }
    private void inicializarPanel(){
        this.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY), "Conjunto de Reglas"));
    }
    private void inicializarPanelBotones(){
        //botones.setBorder(BorderFactory.createLineBorder(Color.CYAN));
        
    }

    private void inicializarLayout(){
        this.setLayout(layout);
        
        layout.putConstraint(SpringLayout.WEST, lblN, 10, SpringLayout.WEST, this);
        layout.putConstraint(SpringLayout.EAST, lblN, 15, SpringLayout.WEST, lblN);
        layout.putConstraint(SpringLayout.NORTH, lblN, 0, SpringLayout.NORTH, this);
        layout.putConstraint(SpringLayout.SOUTH, lblN, 20, SpringLayout.NORTH, this);

        layout.putConstraint(SpringLayout.WEST, txtN, 20, SpringLayout.WEST, lblN);
        layout.putConstraint(SpringLayout.EAST, txtN, 30, SpringLayout.WEST, txtN);
        layout.putConstraint(SpringLayout.NORTH, txtN, 0, SpringLayout.NORTH, this);
        layout.putConstraint(SpringLayout.SOUTH, txtN, 20, SpringLayout.NORTH, this);

        layout.putConstraint(SpringLayout.EAST, jspTblReglas, 0, SpringLayout.EAST, this);
        layout.putConstraint(SpringLayout.WEST, jspTblReglas, 0, SpringLayout.WEST, this);
        layout.putConstraint(SpringLayout.NORTH, jspTblReglas, 25, SpringLayout.NORTH, this);
        layout.putConstraint(SpringLayout.SOUTH, jspTblReglas, 190, SpringLayout.NORTH, this);
        
        layout.putConstraint(SpringLayout.EAST, pBusqueda, 0, SpringLayout.EAST, this);
        layout.putConstraint(SpringLayout.WEST, pBusqueda, 0, SpringLayout.WEST, this);
        layout.putConstraint(SpringLayout.SOUTH, pBusqueda, 0, SpringLayout.SOUTH, this);
        layout.putConstraint(SpringLayout.NORTH, pBusqueda, 10, SpringLayout.SOUTH, jspTblReglas);

    }
    
    private void inicializarLayoutBusqueda() {
        pBusqueda.setLayout(layoutBusqueda);
        
        
        layoutBusqueda.putConstraint(SpringLayout.WEST, lblAlpha, 10, SpringLayout.WEST, pBusqueda);
        layoutBusqueda.putConstraint(SpringLayout.NORTH, lblAlpha, 10, SpringLayout.NORTH, pBusqueda);
        
        layoutBusqueda.putConstraint(SpringLayout.WEST, lblBeta, 0, SpringLayout.WEST, lblAlpha);
        layoutBusqueda.putConstraint(SpringLayout.NORTH, lblBeta, 10, SpringLayout.SOUTH, lblAlpha);
        
        layoutBusqueda.putConstraint(SpringLayout.WEST, txtAlpha, 10, SpringLayout.EAST, lblAlpha);
        layoutBusqueda.putConstraint(SpringLayout.NORTH, txtAlpha, 0, SpringLayout.NORTH, lblAlpha);
        layoutBusqueda.putConstraint(SpringLayout.EAST, txtAlpha, 160, SpringLayout.WEST, txtAlpha);
        
        layoutBusqueda.putConstraint(SpringLayout.WEST, txtBeta, 0, SpringLayout.WEST, txtAlpha);
        layoutBusqueda.putConstraint(SpringLayout.NORTH, txtBeta, 0, SpringLayout.NORTH, lblBeta);
        layoutBusqueda.putConstraint(SpringLayout.EAST, txtBeta, 160, SpringLayout.WEST, txtBeta);
        
        layoutBusqueda.putConstraint(SpringLayout.WEST, btnBuscarR, 10, SpringLayout.EAST, txtAlpha);
        layoutBusqueda.putConstraint(SpringLayout.SOUTH, btnBuscarR, 0, SpringLayout.SOUTH, lblBeta);
        layoutBusqueda.putConstraint(SpringLayout.EAST, btnBuscarR, 100, SpringLayout.WEST, btnBuscarR);
        
        layoutBusqueda.putConstraint(SpringLayout.WEST, jspTblBReglas, 0, SpringLayout.WEST, pBusqueda);
        layoutBusqueda.putConstraint(SpringLayout.NORTH, jspTblBReglas, 30, SpringLayout.SOUTH, txtAlpha);
        layoutBusqueda.putConstraint(SpringLayout.EAST, jspTblBReglas, 0, SpringLayout.EAST, pBusqueda);
        layoutBusqueda.putConstraint(SpringLayout.SOUTH, jspTblBReglas, 0, SpringLayout.SOUTH, pBusqueda);
        
    }
    
    private void borrarTabla(int id) {
        if (id == 1) {
            dtm = construirTableModel();
            tblReglas.setModel(dtm);
            construirSorter(tblReglas,dtm);
        }
        else {
            dtmB = construirTableModel();
            tblBReglas.setModel(dtmB);
            construirSorter(tblBReglas,dtmB);
        }
    }
    
    private void montar(){
        this.add(jspTblReglas);  
        this.add(lblN);
        this.add(txtN);
        pBusqueda.add(txtAlpha);
        pBusqueda.add(txtBeta);      
        pBusqueda.add(lblAlpha);
        pBusqueda.add(lblBeta);
        pBusqueda.add(btnBuscarR);
        pBusqueda.add(jspTblBReglas);
        
        this.add(pBusqueda);
    }
    

}
